package com.baizhi.controller;

import com.baizhi.entity.Product;
import com.baizhi.vos.CollectionVO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("product")
public class ProductController {
    private static final Logger log = LoggerFactory.getLogger(ProductController.class);

    @Value("${server.port}")
    private int port;

    @GetMapping
    public String product() {
        log.info("order server ...");
        return "product ok, 当前提供服务端口：" + port;
    }

    @GetMapping("/list")
    public String list(HttpServletRequest request) {
        String header = request.getHeader("User-Name");
        System.out.println("获取请求头信息：" + header);
        System.out.println("获取对应请求参数：" + request.getParameter("color"));
        log.info("商品列表服务");
        return "list ok, 当前提供服务端口：" + port;
    }

    // 定义一个接收零散类型参数接口   queryString
    @GetMapping("/test")
    public String test(String name, Integer age) {
        log.info("name:{}, age:{}", name, age);
        return "test ok, 当前提供服务端口：" + port;
    }

    // 定义一个接收零散类型参数接口   路径传递参数
    @GetMapping("/test1/{id}/{name}")
    public String test1(@PathVariable("id") Integer id, @PathVariable("name") String name) {
        log.info("id:{}, name:{}", id, name);
        return "test1 ok, 当前提供服务端口：" + port;
    }

    // 定义一个接收对象类型参数接口   表单方式
    @PostMapping("/test2")
    public String test2(Product product) {
        log.info("product:{}", product);
        return "test2 ok, 当前提供服务端口：" + port;
    }

    // 定义一个接收对象类型参数接口   json方式
    @PostMapping("/test3")
    public String test3(@RequestBody Product product) {
        log.info("product:{}", product);
        return "test3 ok, 当前提供服务端口：" + port;
    }

    // 定义一个接收数组类型参数接口
    @GetMapping("/test4")
    public String test4(String[] ids) {
        for (String id : ids) {
            log.info("id:{}", id);
        }
        return "test4 ok, 当前提供服务端口：" + port;
    }

    // 定义一个接收集合类型参数接口
    // SpringMVC不能直接接收集合类型参数，需要将集合放入对象中，使用对象的方式接收才行
    @GetMapping("/test5")
    public String test5(CollectionVO collectionVO) {
        collectionVO.getIds().forEach(id -> log.info("id:{}", id));
        return "test5 ok, 当前提供服务端口：" + port;
    }

    // 根据id查询商品信息，返回对象
    @GetMapping("{id}")
    public Product product(@PathVariable("id") Integer id) throws InterruptedException {
        log.info("id:{}", id);
        Thread.sleep(2000);
        return new Product(id, "超短连衣裙", 23.23, new Date());
    }

    // 根据类别id查询商品列表，返回列表
    @GetMapping("/products")
    public List<Product> findByCategoryId(Integer categoryId) {
        log.info("categoryId:{}", categoryId);
        List<Product> products = new ArrayList<>();
        products.add(new Product(1, "短裙", 23.23, new Date()));
        products.add(new Product(2, "超短裙", 23.23, new Date()));
        products.add(new Product(3, "超级短裙", 23.23, new Date()));
        return products;
    }

    // 根据类别id分页查询商品列表，返回列表
    @GetMapping("/productPage")
    public Map<String, Object> findPageByCategoryId(Integer page, Integer rows, Integer categoryId) {
        log.info("当前页：{}, 每页显示记录数：{}, 当前类别id：{}", page, rows, categoryId);
        Map<String, Object> map = new HashMap<>();
        // 1.查询总条数
        int total = 1000;
        map.put("total", total);
        // 2.查询分页列表
        List<Product> products = new ArrayList<>();
        products.add(new Product(1, "短裙", 23.23, new Date()));
        products.add(new Product(2, "超短裙", 23.23, new Date()));
        products.add(new Product(3, "超级短裙", 23.23, new Date()));
        map.put("data", products);
        return map;
    }
}
